package park.model.moment_interval;
import java.io.Serializable;
import java.sql.Date;
import java.sql.Time;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;

import park.model.place.Estacionamento;
import park.model.role.Funcionario;
import park.model.thing.Veiculo;

/**
 * @archetype moment-interval
 * @author gilberto
 * @since 04/06/2009
 */
public class Estada implements Serializable {
	private static final long serialVersionUID = 1L;
	/*
	 * References Veiculo class. 
	 * Note: 
	 * 	- the real state of this realacionship is placa;
	 *  - the lookup data is veiculo
	 */
	private String placa;
	private transient Veiculo veiculo;

	/*
	 * References Estacionamento class. 
	 * Note: 
	 * 	- the real state of this realacionship is cdEstacionamento;
	 *  - the lookup data is estacionamento
	 */
	private Integer cdEstacionamento;
	private transient Estacionamento estacionamento;
	
	/*
	 * References Funcionario class. 
	 * Note: 
	 * 	- the real state of this realacionship is matriculaEntrada;
	 *  - the lookup data is funcionarioEntrada
	 */
	private String matriculaEntrada;
	private transient Funcionario funcionarioEntrada;
	private Date dtEntrada;
	private Time hrEntrada;
	/*
	 * References Funcionario class. 
	 * Note: 
	 * 	- the real state of this realacionship is matriculaSaida;
	 *  - the lookup data is funcionarioSaida
	 */
	private String matriculaSaida;
	private transient Funcionario funcionarioSaida;
	private Date dtSaida;
	private Time hrSaida;
	/*
	 * Status: 
	 * 	1 - Veiculo entrou
	 *  2 - Veiculo saiu
	 *  3 - Cancelada
	 */	
	private String status;
	private double valor;
	
	public Estada() {
		// TODO Auto-generated constructor stub
	}

	public Estada(String placa, Integer cdEstacionamento, String matriculaEntrada,
			Date dtEntrada, Time hrEntrada, String matriculaSaida,
			Date dtSaida, Time hrSaida, String status, double valor) {
		this.placa = placa;
		this.cdEstacionamento = cdEstacionamento;
		this.matriculaEntrada = matriculaEntrada;
		this.dtEntrada = dtEntrada;
		this.hrEntrada = hrEntrada;
		this.matriculaSaida = matriculaSaida;
		this.dtSaida = dtSaida;
		this.hrSaida = hrSaida;
		this.status = status;
		this.valor = valor;
	}

	public Estada(Veiculo veiculo, Estacionamento estacionamento, Funcionario funcionarioEntrada, Date dtEntrada,
			Time hrEntrada, Funcionario funcionarioSaida, Date dtSaida, Time hrSaida,
			String status, double valor) {
		setVeiculo(veiculo);
		setEstacionamento(estacionamento);
		setFuncionarioEntrada(funcionarioEntrada);
		this.dtEntrada = dtEntrada;
		this.hrEntrada = hrEntrada;
		setFuncionarioSaida(funcionarioSaida);
		this.dtSaida = dtSaida;
		this.hrSaida = hrSaida;
		this.status = status;
		this.valor = valor;
	}

	public String getPlaca() {return placa;}
	public void setPlaca(String placa) {this.placa = placa;}
	public Veiculo getVeiculo() {return veiculo;}
	public void setVeiculo(Veiculo veiculo) {
		this.veiculo = veiculo;
		this.placa = veiculo.getPlaca();
	}	
	public Integer getCdEstacionamento() {return cdEstacionamento;}
	public void setCdEstacionamento(Integer cdEstacionamento) {this.cdEstacionamento = cdEstacionamento;}
	public Estacionamento getEstacionamento() {return estacionamento;}
	public void setEstacionamento(Estacionamento estacionamento) {
		this.estacionamento = estacionamento;
		this.cdEstacionamento = estacionamento.getCdEstacionamento();
	}
	public String getMatriculaEntrada() {return matriculaEntrada;}
	public void setMatriculaEntrada(String matriculaEntrada) {this.matriculaEntrada = matriculaEntrada;	}
	public Funcionario getFuncionarioEntrada() {return funcionarioEntrada;}
	public void setFuncionarioEntrada(Funcionario funcionarioEntrada) {
		this.funcionarioEntrada = funcionarioEntrada;
		this.matriculaEntrada = funcionarioEntrada.getMatricula();
	}
	public Date getDtEntrada() {return dtEntrada;}
	public void setDtEntrada(Date dtEntrada) {this.dtEntrada = dtEntrada;}
	public Time getHrEntrada() {return hrEntrada;}
	public void setHrEntrada(Time hrEntrada) {this.hrEntrada = hrEntrada;}
	public String getMatriculaSaida() {return matriculaSaida;}
	public void setMatriculaSaida(String matriculaSaida) {this.matriculaSaida = matriculaSaida;	}
	public Funcionario getFuncionarioSaida() {return funcionarioSaida;}
	public void setFuncionarioSaida(Funcionario funcionarioSaida) {
		this.funcionarioSaida = funcionarioSaida;
		this.matriculaSaida = funcionarioSaida.getMatricula();
	}
	public Date getDtSaida() {return dtSaida;}
	public void setDtSaida(Date dtSaida) {this.dtSaida = dtSaida;}
	public Time getHrSaida() {return hrSaida;}
	public void setHrSaida(Time hrSaida) {this.hrSaida = hrSaida;}
	public String getStatus() {return status;}
	public void setStatus(String status) {this.status = status;}
	public double getValor() {return valor;	}
	public void setValor(double valor) {this.valor = valor;}

	@Override
	public boolean equals(final Object other) {
		if (this == other)
			return true;
		if (!(other instanceof Estada))
			return false;
		Estada castOther = (Estada) other;
		return new EqualsBuilder()
				.append(placa, castOther.placa)
				//.append(veiculo,	castOther.veiculo)  transient field
				.append(cdEstacionamento, castOther.cdEstacionamento)
				//.append(estacionamento,	castOther.estacionamento)  transient field
				.append(matriculaEntrada, castOther.matriculaEntrada)
				//.append(funcionarioEntrada,	castOther.funcionarioEntrada)   transient field
				.append(dtEntrada,	castOther.dtEntrada)
				.append(hrEntrada, castOther.hrEntrada)
				.append(matriculaSaida, castOther.matriculaSaida)
				//.append(funcionarioSaida, castOther.funcionarioSaida)   transient field
				.append(dtSaida, castOther.dtSaida)
				.append(hrSaida, castOther.hrSaida)
				.append(status, castOther.status)
				.append(valor, castOther.valor).isEquals();
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder()
				.append(placa)
				//.append(veiculo)  transient field
				.append(cdEstacionamento)
				//.append(estacionamento)  transient field
				.append(matriculaEntrada)
				//.append(funcionarioEntrada)  transient field
				.append(dtEntrada)
				.append(hrEntrada)
				.append(matriculaSaida)
				//.append(funcionarioSaida)  transient field
				.append(dtSaida)
				.append(hrSaida)
				.append(status)
				.append(valor).toHashCode();
	}

	@Override
	public String toString() {
		return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
				.appendSuper(super.toString())
				.append("placa", placa)
				.append("cdEstacionamento",	cdEstacionamento)
				.append("matriculaEntrada",	matriculaEntrada)
				.append("dtEntrada", dtEntrada)
				.append("hrEntrada", hrEntrada)
				.append("matriculaSaida", matriculaSaida)
				.append("dtSaida", dtSaida)
				.append("hrSaida", hrSaida)
				.append("status", status)
				.append("valor", valor).toString();
	}

}
